﻿//#include<iostream>
//
//using namespace std;
//
//const int N = 1e4 + 10;
//
//int n;
//int a[N], b[N];
//
//int check1()
//{
//	a[1] = 0;
//	for (int i = 2; i <= n + 1; i++)
//	{
//		a[i] = b[i - 1] - a[i - 1] - a[i - 2];
//		if (a[i] > 1 || a[i] < 0)
//		{
//			return 0;
//		}
//	}
//	if (a[n + 1] == 0)
//	{
//		return 1;
//	}
//	else
//	{
//		return 0;
//	}
//}
//
//int check2()
//{
//	a[1] = 1;
//	for (int i = 2; i <= n + 1; i++)
//	{
//		a[i] = b[i - 1] - a[i - 1] - a[i - 2];
//		if (a[i] > 1 || a[i] < 0)
//		{
//			return 0;
//		}
//	}
//	if (a[n + 1] == 0)
//	{
//		return 1;
//	}
//	else
//	{
//		return 0;
//	}
//}
//
//int main()
//{
//	cin >> n;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> b[i];
//	}
//
//	int ret = 0;
//
//	ret += check1();
//	ret += check2();
//
//	cout << ret;
//	return 0;
//}

//子集
//#include<iostream>
//#include<vector>
//
//using namespace std;
//
//class Slotion
//{
//public:
//	vector<vector<int>> subsets(vector<int>& nums)
//	{
//		int n = nums.size();
//		vector<vector<int>> ret;
//		for (int st = 0; st < (1 << n); st++)
//		{
//			vector<int> tmp;
//			for (int i = 0; i < n; i++)
//			{
//				if ((st >> i) & 1 )
//				{
//					tmp.push_back(nums[i]);
//				}
//			}
//			ret.push_back(tmp);
//		}
//		return ret;
//	}
//
//};
//
//int main()
//{
//	vector<int> x = { 1,2,3,4 };
//	Slotion S;
//	vector<vector<int>> y;
//	y = S.subsets(x);
//
//	return 0;
//}


#include <iostream>
#include <cstring>
using namespace std;
const int N = 10;
int n = 5;
int a[N]; // ⽤⼆进制表⽰，来存储灯的状态 
int t[N]; // 备份 a 数组 
// 计算 x 的⼆进制表⽰中⼀共有多少个 1 
int calc(int x)
{
	int cnt = 0;
	while (x)
	{
		cnt++;
		x &= x - 1;
	}
	return cnt;
}
int main()
{
	int T; cin >> T;
	while (T--)
	{
		// 多组测试时，⼀定要注意清空之前的数据 
		memset(a, 0, sizeof a);
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				char ch; cin >> ch;
				// 存成相反的 
				if (ch == '0') a[i] |= 1 << j;
			}
		}
		int ret = 0x3f3f3f3f; // 统计所有合法的按法中的最⼩值 
		// 枚举第⼀⾏所有的按法 
		for (int st = 0; st < (1 << n); st++)
		{
			memcpy(t, a, sizeof a);
			int push = st; // 当前⾏的按法 
			int cnt = 0; // 统计当前按法下⼀共按了多少次 
			// 依次计算后续⾏的结果以及按法 
			for (int i = 0; i < n; i++)
			{
				cnt += calc(push);
				// 修改当前⾏被按的结果 
				t[i] = t[i] ^ push ^ (push << 1) ^ (push >> 1);
				t[i] &= (1 << n) - 1; // 清空影响 
				// 修改下⼀⾏的状态 
				t[i + 1] ^= push;
				// 下⼀⾏的按法 
				push = t[i];
			}
			if (t[n - 1] == 0) ret = min(ret, cnt);
		}
		if (ret > 6) cout << -1 << endl;
		else cout << ret << endl;
	}
	return 0;
}